package com.blog.cmrpersonalblog.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.blog.cmrpersonalblog.dto.announcement.request.AnnouncementQueryRequest;
import com.blog.cmrpersonalblog.dto.announcement.request.UserAnnouncementMessageQueryRequest;
import com.blog.cmrpersonalblog.dto.announcement.response.AnnouncementResponse;
import com.blog.cmrpersonalblog.dto.announcement.response.UserAnnouncementMessageResponse;
import com.blog.cmrpersonalblog.entity.Announcement;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 公告Mapper接口
 */
@Mapper
public interface AnnouncementMapper extends BaseMapper<Announcement> {

    /**
     * 分页查询公告列表（管理员）
     * @param page 分页对象
     * @param queryRequest 查询条件
     * @return 公告分页列表
     */
    IPage<AnnouncementResponse> selectAnnouncementPage(Page<AnnouncementResponse> page, 
                                                      @Param("query") AnnouncementQueryRequest queryRequest);

    /**
     * 分页查询有效公告列表（用户）
     * @param page 分页对象
     * @param queryRequest 查询条件
     * @param userId 用户ID（用于查询是否已读）
     * @return 公告分页列表
     */
    IPage<AnnouncementResponse> selectValidAnnouncementPage(Page<AnnouncementResponse> page, 
                                                           @Param("query") AnnouncementQueryRequest queryRequest,
                                                           @Param("userId") Long userId);

    /**
     * 获取公告详情
     * @param announcementId 公告ID
     * @param userId 用户ID（用于查询是否已读，可为null）
     * @return 公告详情
     */
    AnnouncementResponse selectAnnouncementDetail(@Param("announcementId") Long announcementId, 
                                                 @Param("userId") Long userId);

    /**
     * 获取置顶公告列表
     * @param targetAudience 目标受众
     * @param userId 用户ID（用于查询是否已读，可为null）
     * @return 置顶公告列表
     */
    List<AnnouncementResponse> selectTopAnnouncements(@Param("targetAudience") String targetAudience,
                                                     @Param("userId") Long userId);

    /**
     * 获取弹窗公告列表
     * @param targetAudience 目标受众
     * @param userId 用户ID（用于查询是否已读）
     * @return 弹窗公告列表
     */
    List<AnnouncementResponse> selectPopupAnnouncements(@Param("targetAudience") String targetAudience,
                                                       @Param("userId") Long userId);

    /**
     * 批量更新公告状态
     * @param announcementIds 公告ID列表
     * @param status 新状态
     * @param updaterId 更新人ID
     * @param updaterName 更新人姓名
     * @return 影响行数
     */
    int batchUpdateStatus(@Param("announcementIds") List<Long> announcementIds,
                         @Param("status") Integer status,
                         @Param("updaterId") Long updaterId,
                         @Param("updaterName") String updaterName);

    /**
     * 批量更新置顶状态
     * @param announcementIds 公告ID列表
     * @param isTop 是否置顶
     * @param updaterId 更新人ID
     * @param updaterName 更新人姓名
     * @return 影响行数
     */
    int batchUpdateTop(@Param("announcementIds") List<Long> announcementIds,
                      @Param("isTop") Integer isTop,
                      @Param("updaterId") Long updaterId,
                      @Param("updaterName") String updaterName);

    /**
     * 批量更新弹窗状态
     * @param announcementIds 公告ID列表
     * @param isPopup 是否弹窗
     * @param updaterId 更新人ID
     * @param updaterName 更新人姓名
     * @return 影响行数
     */
    int batchUpdatePopup(@Param("announcementIds") List<Long> announcementIds,
                        @Param("isPopup") Integer isPopup,
                        @Param("updaterId") Long updaterId,
                        @Param("updaterName") String updaterName);

    /**
     * 增加公告查看次数
     * @param announcementId 公告ID
     * @return 影响行数
     */
    int incrementViewCount(@Param("announcementId") Long announcementId);

    /**
     * 自动过期公告（将过期时间已到的公告状态设为已过期）
     * @return 影响行数
     */
    int autoExpireAnnouncements();

    /**
     * 获取公告统计信息
     * @return 统计信息
     */
    Map<String, Object> selectAnnouncementStatistics();

    /**
     * 根据创建人ID查询公告数量
     * @param creatorId 创建人ID
     * @return 公告数量
     */
    int countByCreatorId(@Param("creatorId") Long creatorId);

    /**
     * 清理已删除的公告（物理删除）
     * @param beforeTime 删除时间之前的记录
     * @return 影响行数
     */
    int cleanDeletedAnnouncements(@Param("beforeTime") LocalDateTime beforeTime);

    /**
     * 分页查询用户消息中心公告列表
     * @param page 分页对象
     * @param queryRequest 查询条件
     * @param userId 用户ID
     * @param targetAudience 目标受众
     * @return 公告分页列表
     */
    IPage<UserAnnouncementMessageResponse> selectUserMessageAnnouncementPage(
        Page<UserAnnouncementMessageResponse> page,
        @Param("query") UserAnnouncementMessageQueryRequest queryRequest,
        @Param("userId") Long userId,
        @Param("targetAudience") String targetAudience
    );
}
